Conosciamo tutti la famosa funzione VLOOKUP() che ci aiuta a combinare i dati di tabelle diverse. Tuttavia, questa funzione presenta uno svantaggio significativo: non può combinare valori simili, ovvero se c'è un errore nella parola, non ci sarà alcuna corrispondenza.
Per poter combinare valori approssimativi, possiamo creare la nostra funzione. Chiamiamolo FuzzyLookup().
Immaginiamo di avere due elenchi. Entrambi hanno approssimativamente gli stessi elementi, ma possono essere scritti in modo leggermente diverso. Il compito è trovare per ciascun elemento del primo elenco l'elemento più simile del secondo elenco, ovvero implementare una ricerca per il testo massimamente simile più vicino.
La grande domanda, in questo caso, è cosa considerare come criterio di “somiglianza”. Solo il numero di caratteri corrispondenti? Il numero di partite consecutive? È opportuno considerare maiuscole e minuscole o gli spazi? Cosa fare con la diversa disposizione delle parole in una frase? Ci sono molte opzioni e non esiste un'unica soluzione: per ogni situazione l'una o l'altra sarà migliore dell'altra.
Nel nostro caso, implementiamo l'opzione più semplice: ricerca in base al numero massimo di corrispondenze di caratteri. Non è perfetto, ma funziona abbastanza bene per la maggior parte delle situazioni.
Aggiungere funzione FuzzyLookup , aprire il menu Tools - Macros - Edit Macros... , Selezionare Module1 e copia il seguente testo nel modulo:
Function FuzzyLOOKUP(LookupValue As String, SrcTable As Variant, Optional SimThreshold As Single) As String
' moonexcel.com.ua
Dim Str As String
Dim CellArray As Variant
Dim StrArray As Variant
If IsMissing(SimThreshold) Then SimThreshold = 0
Str = LCase(LookupValue)
StrArray = Split(Str)
StrExt = UBound(StrArray)
For Each Cell In SrcTable
CellArray = Split(LCase(Cell))
CellExt = UBound(CellArray)
CellRate = 0
' Controlliamo ogni parola nella frase di ricerca
For x = 0 To StrExt
StrWord = StrArray(x)
If Len(StrWord) = 0 Then GoTo continue_x
MaxStrWordRate = 0
' Controlliamo ogni parola nella cella successiva dalla tabella dei valori originale
For i = 0 To CellExt
CellWord = CellArray(i)
If Len(CellWord) = 0 Then GoTo continue_i
FindCharNum = OccurrenceNum(StrWord, CellWord)
StrWordRate = FindCharNum / Max(Len(StrWord),Len(CellWord))
If StrWordRate > MaxStrWordRate Then MaxStrWordRate = StrWordRate
continue_i:
Next i
CellRate = CellRate + MaxStrWordRate
continue_x:
Next x
' Manteniamo la migliore corrispondenza
If CellRate > MaxCellRate Then
MaxCellRate = CellRate
BestCell = Cell
FindCharNum = OccurrenceNum(Str, Cell)
SimRate = FindCharNum / Max(Len(Str),Len(Cell))
End If
Next Cell
IF SimRate >= SimThreshold Then
IF SimThreshold = -1 Then
ReturnValue = BestCell + " (" + Format(SimRate, "0.00") + ")"
ElseIf SimThreshold = -2 Then
ReturnValue = Format(SimRate, "0.00")
Else
ReturnValue = BestCell
End If
Else
ReturnValue = ""
End If
FuzzyLOOKUP = ReturnValue
End Function
Function OccurrenceNum(ByVal SourceString As String, ByVal TargetString As String)
For i = 1 To Len(SourceString)
' Stiamo cercando l'occorrenza di ciascun simbolo
Position = InStr(1, TargetString, Mid(SourceString, i, 1), 1)
' Aumentiamo il contatore delle coincidenze
If Position > 0 Then
Count = Count + 1
' Rimuovi il simbolo trovato
TargetString = Left(TargetString, Position - 1) + Right(TargetString, Len(TargetString) - Position)
End If
Next i
OccurrenceNum = Count
End Function
Function Max(ByVal value1 As Variant, ByVal value2 As Variant)
If value1 > value2 Then
Result = value1
Else
Result = value2
End If
Max = Result
End Function
Quindi, chiudi Macro Editor e tornare al foglio di lavoro LibreOffice Calc - ora puoi utilizzare la nostra nuova funzionalità FuzzyLookup() .
Puoi anche utilizzare la funzione FUZZYLOOKUP() installando l'estensione gratuita YouLibreCalc.oxt o la sua versione completa YLC_Utilities.oxt .
Successivamente, questa funzione sarà disponibile in tutti i file che verranno aperti in LibreOffice Calc.